package rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.ArrayList;
import data.*;

/**
 * Interface du Serveur RMI, déclare toutes les méthodes distantes invoquables par le client RMI.
 * Ces méthodes permettent de communiquer avec la base de données.
 * 
 * @author Guillaume Dadoy & Emeric Tassel
 *
 */
public interface ServeurRmiInterface extends Remote{
	/**
	 * Méthode qui permet d'authentifier un medecin.
	 * 
	 * @param id
	 * Identifiant du medecin (numéro d’inscription au Conseil de l’Ordre des Médecins).
	 * @param pwd
	 * Mot de passe du medecin.
	 * @return
	 * <b>true</b> si les identifiants sont corrects.
	 * <b>false</b> si les identifiants sont incorrects ou si une erreur s'est produite.
	 * @throws RemoteException
	 */
	public boolean authentifier(String id, String pwd) throws RemoteException;
	
	/**
	 * Méthode générique qui permet d'insérer des éléments en base de données
	 * 
	 * @param data
	 * Objet de type hérité de Data à insérer en base de données
	 * @return
	 * <b>l'Id de l'élément inséré</b> si il est auto-incrément.
	 * <b>0</b> dans le cas contraire.
	 * <b>-1</b> en cas d'échec.
	 * @throws RemoteException
	 */
	public int stocker(Data data) throws RemoteException;
	
	/**
	 * Méthode générique qui permet de modifier des éléments en base de données.
	 * 
	 * @param data
	 * Objet de type hérité de Data à modifier en base de données.
	 * @return
	 * <b>true</b> en cas de succès.
	 * <b>false</b> en cas d'échec.
	 * @throws RemoteException
	 */
	public boolean modifier(Data data) throws RemoteException;
	
	/**
	 * Méthode générique qui permet de compter le nombre d'enregistrements dans la table correspondante à la classe donnée en paramètre.
	 * 
	 * @param c
	 * Classe (héritée de Data) correspondant à la table à interroger.
	 * @return
	 * Le nombre d'enregistrements de la table.
	 * @throws RemoteException
	 */
	public int nbEnregistrements(@SuppressWarnings("rawtypes") Class c) throws RemoteException;
	
	/**
	 * Méthode qui permet d'obtenir la liste des patients enregistrés en base de données.
	 * 
	 * @param numero_securite_sociale
	 * Critère de recherche facultatif correspondant au numéro de sécurité sociale du patient.
	 * @param nom
	 * Critère de recherche facultatif correspondant au nom de famille du patient.
	 * @param prenom
	 * Critère de recherche facultatif correspondant au prénom du patient.
	 * @param debut
	 * Définit à partir de quel enregistrement lister.
	 * @param nombre
	 * Définit le nombre maximal d'enregistrement à lister.
	 * @return
	 * Un {@link ArrayList} contenant les objets {@link Patient}.
	 * @throws RemoteException
	 */
	public ArrayList<Patient> listerPatients(String numero_securite_sociale, String nom, String prenom,int debut, int nombre) throws RemoteException;
	
	/**
	 * Méthode qui permet d'obtenir le patient correspondant à un numéro de sécurité sociale.
	 * 
	 * @param numero_securite_sociale
	 * Numéro de sécurité sociale du patient.
	 * @return
	 * Le {@link Patient} correspondant au numéro de sécurité sociale passé en paramètre.
	 * @throws RemoteException
	 */
	public Patient getPatient(String numero_securite_sociale) throws RemoteException;
	
	/**
	 * Méthode qui permet de supprimer le patient correspondant à un numéro de sécurité sociale.
	 * 
	 * @param numero_securite_sociale
	 * Numéro de sécurité sociale du patient.
	 * @return
	 * <b>true</b> en cas de succès.
	 * <b>false</b> en cas d'échec.
	 * @throws RemoteException
	 */
	public boolean supprimerPatient(String numero_securite_sociale) throws RemoteException;
	
	/**
	 * Méthode qui permet d'obtenir la liste des médicaments enregistrés en base de données.
	 * 
	 * @param nom_medicament
	 * Critère de recherche facultatif correspondant au nom du médicament.
	 * @return
	 * Un {@link ArrayList} contenant les objets {@link Medicament}.
	 * @throws RemoteException
	 */
	public ArrayList<Medicament> listerMedicaments(String nom_medicament) throws RemoteException; 
	
	/**
	 * Méthode qui permet d'obtenir le médicament correspondant à un identifiant de médicament.
	 * 
	 * @param id_medicament
	 * L'identifiant du médicament.
	 * @return
	 * Le {@link Medicament} correspondant à l'identifiant passé en paramètre.
	 * @throws RemoteException
	 */
	public Medicament getMedicament(Integer id_medicament) throws RemoteException;
	
	/**
	 * Méthode qui permet d'obtenir la liste des médecins enregistrés en base de données.
	 * 
	 * @param numero_enregistrmeent
	 * Critère de recherche facultatif correspondant au numéro d'enregistrement du médecin.
	 * @param nom
	 * Critère de recherche facultatif correspondant au nom de famille du médecin
	 * @param prenom
	 * Critère de recherche facultatif correspondant au prénom du médecin.
	 * @param debut
	 * Définit à partir de quel enregistrement lister.
	 * @param nombre
	 * Définit le nombre maximal d'enregistrement à lister.
	 * @return
	 * Un {@link ArrayList} contenant les objets {@link Patient}.
	 * @throws RemoteException
	 */
	public ArrayList<Medecin> listerMedecins(String numero_enregistrement, String nom, String prenom,int debut, int nombre) throws RemoteException;
	

	/**
	 * Méthode qui permet d'obtenir le médecin correspondant l'identifiant du medecin (numéro d’inscription au Conseil de l’Ordre des Médecins).
	 * 
	 * @param id_medecin
	 * L'identifiant du medecin (numéro d’inscription au Conseil de l’Ordre des Médecins).
	 * @return
	 * {@link Medecin} correspondant à l'identifiant passé en paramètre.
	 * @throws RemoteException
	 */
	public Medecin getMedecin(String id_medecin) throws RemoteException;
	
	/**
	 * Méthode qui permet d'obtenir la liste des ordonnances enregistrées en base de données.
	 * 
	 * @param numero_securite_sociale_patient
	 * Critère de recherche facultatif correspondant au numéro de sécurité sociale du patient.
	 * @param date_ordonnance
	 * Critère de recherche facultatif correspondant à la date d'édition de l'ordonnance.
	 * @param debut
	 * Définit à partir de quel enregistrement lister.
	 * @param nombre
	 * Définit le nombre maximal d'enregistrement à lister.
	 * @return
	 * @throws RemoteException
	 */
	public ArrayList<Ordonnance> listerOrdonnances(String numero_securite_sociale_patient, String date_ordonnance, int debut, int nombre) throws RemoteException; 
	
	/**
	 * Méthode qui permet d'obtenir la liste des médicaments associés à une ordonnance.
	 * 
	 * @param id_ordonnance
	 * L'identifiant de l'ordonnance.
	 * @return
	 * Un {@link ArrayList} contenant les objets {@link Medicament}.
	 * @throws RemoteException
	 */
	public ArrayList<Medicament> listerMedicamentsOrdonnance(Integer id_ordonnance) throws RemoteException;
	
	/**
	 * Méthode qui permet d'obtenir l'ordonnance correspondant à un identifiant d'ordonnance.
	 * 
	 * @param id_ordonnance
	 * L'identifiant de l'ordonnance.
	 * @return
	 * L'{@link Ordonnance} correspondant à l'identifiant passé en paramètre.
	 * @throws RemoteException
	 */
	public Ordonnance getOrdonnance(Integer id_ordonnance) throws RemoteException;
	
	/**
	 * Méthode qui permet d'obtenir la liste des droits d'accès.
	 * 
	 * @return
	 * Un {@link ArrayList} contenant la liste des droits d'accès.
	 * @throws RemoteException
	 */
	public ArrayList<DroitAcces> listerDroitAcces() throws RemoteException;
	
	/**
	 * @deprecated
	 * utiliser nbEnregistrement(Patient.class) à la place
	 */
	@Deprecated
	public int nbPatients() throws RemoteException;
}
